package cluedo;


import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.Serializable;

import javax.swing.ImageIcon;

/** Questa classe rappresenta una generica carta */
public abstract class Card implements Serializable {

	private static final long serialVersionUID = -9128691607126594001L;
	
	/***
	 * Il path da cui prelevare l'immagine che evidenzia una carta come non valida per la soluzione
	 */
	protected final String deleteImgPath="/img/carddeleted.png";

	/**
	 * Nome carta, identificativo univoco
	 */
	protected String name;
	
	
	/**
	 * Immagine della carta
	 */
	protected ImageIcon cardImage=null;
	
	/**
	 * Immagine della carta scalata dall'ultima chiamata a getScaledImage()
	 */
	protected ImageIcon scaledImg=null;
	
	/**
	 * Immagine della carta quando scartata dalla soluzione
	 */
	protected ImageIcon deletedCardImage=null;

	/**
	 * Segnala se una carta e' stata scartata dalla soluzione del gioco
	 */
	transient protected Boolean deleted=false;
	
	
	/** Ritorna il nome della carta
	 * @return il nome della carta 
	 */
	public String getName(){
		return this.name;
		
	}
	
	/** controlla se una carta e' stata scartata dalla soluzione 
	 * @return true se e' stata scartata, false altrimenti
	 */
	public boolean isDeleted(){
		return this.deleted;
	}
	
	/** Controlla se 2 carte sono uguali (confronta i nomi)
	 * @param card2 la carta da confrontare con questa 
	 */
	@Override
	public boolean equals(Object card2) {
	
		Card tmpCard=(Card) card2;
		
		if (this.name.compareTo(tmpCard.getName())==0)
			return true;
		else return false;
	
	}
	
	/**
	 * Ottieni l'immagine associata alla carta
	 * @return vedi descrizione
	 */
	public ImageIcon getImage(){
		
		return cardImage;
	}
	
	
	/**
	 * Ottieni l'immagine associata alla carta scalata come specificato tramite il parametro scale
	 * @param scale regola la dimensione della carta
	 * @return vedi descrizione
	 */
	public ImageIcon getScaledImage(int scale){
		Image tmpImg= cardImage.getImage();
		tmpImg= tmpImg.getScaledInstance(-1, scale, Image.SCALE_SMOOTH);
		this.scaledImg=new ImageIcon(tmpImg);;
		return scaledImg;
	}
	
	/**
	 * Imposta l'immagine associata alla carta
	 */
	abstract protected void setImage();
	
	/** Segna la carta come non valida ai fini della soluzione e la restituisce
	 * @return l'immagine della carta graficamente identificata come non valida per la soluzione 
	 * oppure null se la carta e' gia stata eliminata
	 */
	public ImageIcon delCard(){
		
		if(this.deleted) return null;
		
		BufferedImage image1 = new BufferedImage(
				scaledImg.getIconWidth(),
                scaledImg.getIconHeight(),
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image1.createGraphics();
        // disegna l'immagine scalata nella BufferedImage
        scaledImg.paintIcon(null, g, 0,0);
        
        
        Image tmp = new ImageIcon(Card.class.getResource(deleteImgPath)).getImage();
        ImageIcon deleteImg = new ImageIcon(
        		tmp.getScaledInstance(-1, scaledImg.getIconHeight()/2, Image.SCALE_SMOOTH)
        		);
        
        BufferedImage image2 = new BufferedImage(
				deleteImg.getIconWidth(),
                deleteImg.getIconHeight(),
                BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = image2.createGraphics();
        deleteImg.paintIcon(null, g2, 0,0);
        
        
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
        g.drawImage(image2, (image1.getWidth()-image2.getWidth())/2, (image1.getHeight()-image2.getHeight())/2, null);
        g.dispose();
        this.deletedCardImage = new ImageIcon(image1);
		this.deleted=true;
		
		return deletedCardImage;
	}
	
	/**
	 * Restituisce l'immagine che indica che la carta e' esclusa dalla soluzione
	 * oppure null se la carta non e' stata esclusa
	 * @return vedi descrizione
	 */
	public ImageIcon getDeletedCardImage(){
		
		return deletedCardImage;
	}

	
	@Override
	public String toString() {
		return name;
	}
}
